//
//  CZPhotoBrowserCell.swift
//  czbkiosweibo5
//
//  Created by zhangping on 15/10/23.
//  Copyright © 2015年 zhangping. All rights reserved.
//

import UIKit

/// imageView的最小缩放比例
let CZPhotoBrowserCellMinimumZoomScale: CGFloat = 0.5

class CZPhotoBrowserCell: UICollectionViewCell {
    
    /// 要显示图片的url
    var url: NSURL? {
        didSet {
            // 模拟延时发现因为复用cell,会显示之前cell的图片,等加载完图片后才会显示正确的图片
            imageView.image = nil
            
            // 判断url是否为空
            guard let imageURL = url else {
                print("url 为空")
                return
            }
            
            /// 重置scrollView的一些属性,防止因为cell复用导致cell图片显示的不对
            resetScrollView()
            
            // 当图片已经在本地的时候加载很快,此时scrollView还没有尺寸,需要主动布局s
            layoutIfNeeded()
            
            // 下载前显示菊花
            indicator.startAnimating()
            // 下载图片,在图片下载完成的时候设置图片大小
            imageView.sd_setImageWithURL(imageURL) { (image, error, _, _) -> Void in
                // 下载结束,隐藏菊花
                self.indicator.stopAnimating()
                
                if error != nil {
                    print("下载图片出错")
                    return
                }
                
                print("下载图片完成")
                // 将图片等比例缩放到宽度等于屏幕宽度
                self.layoutImageView(image)
            }
        }
    }
    
    /// 重置scrollView的一些属性,防止因为cell复用导致cell图片显示的不对
    private func resetScrollView() {
        scrollView.contentInset = UIEdgeInsetsZero
        scrollView.contentSize = CGSizeZero
        scrollView.contentOffset = CGPointZero
        imageView.transform = CGAffineTransformIdentity
    }
    
    /*
        将图片等比例缩放到宽度等于屏幕宽度.
            短图: 高度小于屏幕高度, 居中显示
            长图: 高度大于屏幕高度, 顶部开始显示
    */
    
    /**
    - 布局缩放后的图片
        - 短图: 高度小于屏幕高度, 居中显示
        - 长图: 高度大于屏幕高度, 顶部开始显示,并且可以滚动
    */
    private func layoutImageView(image: UIImage) {
        // 获取缩放后的大小
        let size = displaySize(image)
        
        // 判断长短图
        if size.height < scrollView.bounds.height {
            // 短图
            
            // y方向偏移
            let offestY = (scrollView.bounds.height - size.height) * 0.5
            
            // 设置imageView的frame
            imageView.frame = CGRect(x: 0, y: 0, width: size.width, height: size.height)
            // 不能使用 frame 来布局imageView的位置.在缩放后会停在origin的位置.无法显示完整
            scrollView.contentInset = UIEdgeInsets(top: offestY, left: 0, bottom: 0, right: offestY)
        } else {
            // 长图
            // 设置imageView的frame
            imageView.frame = CGRect(origin: CGPointZero, size: size)
            
            // 设置scrollView可以滚动
            scrollView.contentSize = size
        }
    }
    
    // MARK: - 将图片等比例缩放
    /// 将图片等比例缩放
    private func displaySize(image: UIImage) -> CGSize {
        // 将图片等比例缩放到宽度等于屏幕宽度
        // 缩放后的高度 = 缩放后的宽度 * 缩放前的高度 / 缩放前的宽度
        let newWidth = scrollView.bounds.size.width
        let newHeight = newWidth * image.size.height / image.size.width
        
        return CGSize(width: newWidth, height: newHeight)
    }
    
    // MARK: - 构造函数
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        prepareUI()
    }
    
//    private func testAsyncLoadImage() {
//        // TODO: 模拟延时
//        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (Int64)(1 * NSEC_PER_SEC)), dispatch_get_main_queue()) { () -> Void in
//            self.imageView.sd_setImageWithURL(imageURL) { (image, error, _, _) -> Void in
//                // 下载结束,隐藏菊花
//                self.indicator.stopAnimating()
//                
//                if error != nil {
//                    print("下载图片出错")
//                    return
//                }
//                
//                print("下载图片完成")
//                // TODO: 将图片等比例缩放到宽度等于屏幕宽度
//                //                self.imageView.sizeToFit()
//                self.layoutImageView(image)
//            }
//        }
//    }
    
    // MARK: - 准备UI
    /// 准备UI
    private func prepareUI() {
        // 添加子控件
        contentView.addSubview(scrollView)
        scrollView.addSubview(imageView)
        contentView.addSubview(indicator)
        
        // 添加约束
        scrollView.translatesAutoresizingMaskIntoConstraints = false
        indicator.translatesAutoresizingMaskIntoConstraints = false
        // scrollView 填充父控件
        contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-0-[scrollView]-15-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["scrollView" : scrollView]))
        contentView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-0-[scrollView]-0-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["scrollView" : scrollView]))
        
        // imageView的大小不确定,需要根据图片来计算
        
        // 菊花
        contentView.addConstraint(NSLayoutConstraint(item: indicator, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: contentView, attribute: NSLayoutAttribute.CenterX, multiplier: 1, constant: 0))
        contentView.addConstraint(NSLayoutConstraint(item: indicator, attribute: NSLayoutAttribute.CenterY, relatedBy: NSLayoutRelation.Equal, toItem: contentView, attribute: NSLayoutAttribute.CenterY, multiplier: 1, constant: 0))
        
        setupScrollView()
    }
    
    // MARK: - 设置scrollView可以缩放
    /// 设置scrollView可以缩放
    private func setupScrollView() {
        // 设置代理
        scrollView.delegate = self
        
        // 设置缩放比例
        scrollView.maximumZoomScale = 2
        scrollView.minimumZoomScale = CZPhotoBrowserCellMinimumZoomScale
    }
    
    // MARK: - 懒加载
    /// scrollView
    private lazy var scrollView = UIScrollView()
    
    /// imageView
    lazy var imageView: CZImageView = CZImageView()
    
    /// 菊花,指示器
    private lazy var indicator = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.WhiteLarge)
}

// MARK: - 扩展 CZPhotoBrowserCell 实现 UIScrollViewDelegate 协议
extension CZPhotoBrowserCell: UIScrollViewDelegate {
    
    /// 返回缩放的view, scrollView 缩放,实际上是设置 imageView 的transform
    func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? {
        return imageView
    }
    
    /// scrollView缩放时调用
    func scrollViewDidZoom(scrollView: UIScrollView) {
        print("scrollViewDidZoom: imageView.transform: \(imageView.transform)")
    }
    
    /*
        改变tansform后 frame会变化,bounds不会变化
        
        缩放,当用户松手时,imageView.transform的scale > 设置的最小缩放比例, 直接调用 scrollViewDidEndZooming
        imageView.transform的scale < 设置的最小缩放比例系统会先动画到最小缩放比例,在调用 scrollViewDidEndZooming
        解决办法,不让imageView缩放到比指定缩小比例还小的值
    */
    /// scrollView结束缩放
    func scrollViewDidEndZooming (scrollView: UIScrollView, withView view: UIView?, atScale scale: CGFloat) {
        print("scrollView结束缩放: \(imageView.transform)")
        print("image.frame:\(imageView.frame)")
        // 使 imageView显示在中间位置
        var offestX = (scrollView.bounds.width - imageView.frame.width) * 0.5
        var offestY = (scrollView.bounds.height - imageView.frame.height) * 0.5
        
        // 当offestX < 0 时, 让 offestX = 0
        offestX = offestX < 0 ? 0 : offestX
        offestY = offestY < 0 ? 0 : offestY
        
        print("offestX:\(offestX)")
        print("offestY:\(offestY)")
        
        // 添加动画
        UIView.animateWithDuration(0.25) { () -> Void in
            scrollView.contentInset = UIEdgeInsets(top: offestY, left: offestX, bottom: offestY, right: offestX)
        }
    }
}
